package com.shujia.base.day01

/**
 * scala中功能有两种叫法：方法，函数
 * 在class中定义的称之为方法
 * 在object中定义的称之为函数、
 *
 * def: 是scala中定义函数或方法的关键字
 * main:是函数名或方法名
 * args:参数名
 * Array[String]:参数类型
 * Unit:类似于java中的void，表示该函数或方法没有返回值
 * \    = : 后面跟着方法体
 *
 * def main(args: Array[String]): Unit = {
 *
 * }
 *
 */
object Demo4Function {
  def main(args: Array[String]): Unit = {
    //注意1：若函数定义在当前的object中，可以使用类名直接调用
    //    val res1: Int = Demo4Function.add1(100, 200)
    //    println(res1)

    //注意2：若函数定义在当前的object中，可以直接调用，不需要对象名
    //    val res2: Int = add1(11, 22)
    //    println(res2)

    //注意3：函数中可以继续定义函数，为我们后面讲解返回值类型是函数做准备
    //    def add2(a1: Int, b1: Int): Int = {
    //      return a1 + b1
    //    }
    //    //调用必须在定义的后面
    //    val res3: Int = add2(100, 200)
    //    println(res3)
    //
    //    // 注意5: 若调用class类中的方法,必须先创建类的对象
    //    val d1: Demo1 = new Demo1()
    //    val res4: Int = d1.show(100, 200)
    //    println(res4)

    //    Demo2.show2() //可以的, 因为Demo2是被object修饰的,jvm底层会自动创建一个Demo2对象,名字和类名一致,这里相当于对象调用方法

//    val res5: Int = fun1("1000")
//    println(res5)

//    fun2
      fun3()
  }

  //定义格式1: 定义函数,函数特点,只有一个参数和一个返回值
  //  def fun1(s:String):Int={
  //    return s.toInt
  //  }

  //定义格式2: 如果函数中,最后一条语句作为返回值的话,return可以省略不写
  //  def fun1(s: String): Int = {
  //    println("开始将字符串s转成Int类型")
  //    //...
  //    s.toInt
  //  }

  //定义格式3: 如果函数中,函数体中只有一条语句,大括号也可以不用写
//  def fun1(s: String): Int = s.toInt

  //定义格式4: 如果函数没有参数且没有返回值,小括号也可以不用写,注意,调用的时候,也不能有小括号
  def fun2 = println("好好学习,天天向上!  fun2")
  def fun3() = println("好好学习,天天向上! fun3")



  /*
    定义一个函数add1，传入两个Int类型的参数，返回值也是一个Int类型
   */
  def add1(a1: Int, b1: Int): Int = {
    return a1 + b1
  }

}

//注意4：函数不能脱离class或object定义
//def add4(a1: Int, b1: Int): Int = {
//  return a1 + b1
//}

class Demo1 {
  //方法
  def show(a1: Int, b1: Int): Int = {
    return a1 + b1
  }
}

object Demo2 {
  def show2(a1: Int, b1: Int): Int = {
    return a1 + b1
  }
}
